home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP10 / POPPAD2.C < prev    next >
C/C++ Source or Header  |  1995-12-31  |  7KB  |  198 lines

  1. /*-----------------------------------------------------
  2.    POPPAD2.C -- Popup Editor Version 2 (includes menu)
  3.                 (c) Charles Petzold, 1996
  4.   -----------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "poppad2.h"
  8.  
  9. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
  10.  
  11. char szAppName[] = "PopPad2" ;
  12.  
  13. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  14.                     PSTR szCmdLine, int iCmdShow)
  15.      {
  16.      HACCEL     hAccel ;
  17.      HWND       hwnd ;
  18.      MSG        msg ;
  19.      WNDCLASSEX wndclass ;
  20.  
  21.      wndclass.cbSize        = sizeof (wndclass) ;
  22.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  23.      wndclass.lpfnWndProc   = WndProc ;
  24.      wndclass.cbClsExtra    = 0 ;
  25.      wndclass.cbWndExtra    = 0 ;
  26.      wndclass.hInstance     = hInstance ;
  27.      wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
  28.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  29.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  30.      wndclass.lpszMenuName  = szAppName ;
  31.      wndclass.lpszClassName = szAppName ;
  32.      wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
  33.  
  34.      RegisterClassEx (&wndclass) ;
  35.  
  36.      hwnd = CreateWindow (szAppName, szAppName,
  37.                           WS_OVERLAPPEDWINDOW,
  38.                           GetSystemMetrics (SM_CXSCREEN) / 4,
  39.                           GetSystemMetrics (SM_CYSCREEN) / 4,
  40.                           GetSystemMetrics (SM_CXSCREEN) / 2,
  41.                           GetSystemMetrics (SM_CYSCREEN) / 2,
  42.                           NULL, NULL, hInstance, NULL) ;
  43.  
  44.      ShowWindow (hwnd, iCmdShow) ;
  45.      UpdateWindow (hwnd) ; 
  46.  
  47.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  48.  
  49.      while (GetMessage (&msg, NULL, 0, 0))
  50.           {
  51.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  52.                {
  53.                TranslateMessage (&msg) ;
  54.                DispatchMessage (&msg) ;
  55.                }
  56.           }
  57.      return msg.wParam ;
  58.      }
  59.  
  60. AskConfirmation (HWND hwnd)
  61.      {
  62.      return MessageBox (hwnd, "Really want to close PopPad2?",
  63.                         szAppName, MB_YESNO | MB_ICONQUESTION) ;
  64.      }
  65.  
  66. LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  67.      {
  68.      static HWND hwndEdit ;
  69.      int         iSelect, iEnable ;
  70.  
  71.      switch (iMsg)
  72.           {
  73.           case WM_CREATE :
  74.                hwndEdit = CreateWindow ("edit", NULL,
  75.                          WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  76.                               WS_BORDER | ES_LEFT | ES_MULTILINE |
  77.                               ES_AUTOHSCROLL | ES_AUTOVSCROLL,
  78.                          0, 0, 0, 0,
  79.                          hwnd, (HMENU) 1,
  80.                          ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
  81.                return 0 ;
  82.  
  83.           case WM_SETFOCUS :
  84.                SetFocus (hwndEdit) ;
  85.                return 0 ;
  86.  
  87.           case WM_SIZE : 
  88.                MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
  89.                                            HIWORD (lParam), TRUE) ;
  90.                return 0 ;
  91.  
  92.           case WM_INITMENUPOPUP :
  93.                if (lParam == 1)
  94.                     {
  95.                     EnableMenuItem ((HMENU) wParam, IDM_UNDO,
  96.                          SendMessage (hwndEdit, EM_CANUNDO, 0, 0) ?
  97.                               MF_ENABLED : MF_GRAYED) ;
  98.  
  99.                     EnableMenuItem ((HMENU) wParam, IDM_PASTE,
  100.                          IsClipboardFormatAvailable (CF_TEXT) ?
  101.                               MF_ENABLED : MF_GRAYED) ;
  102.  
  103.                     iSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0) ;
  104.  
  105.                     if (HIWORD (iSelect) == LOWORD (iSelect))
  106.                          iEnable = MF_GRAYED ;
  107.                     else
  108.                          iEnable = MF_ENABLED ;
  109.  
  110.                     EnableMenuItem ((HMENU) wParam, IDM_CUT,   iEnable) ;
  111.                     EnableMenuItem ((HMENU) wParam, IDM_COPY,  iEnable) ;
  112.                     EnableMenuItem ((HMENU) wParam, IDM_DEL,   iEnable) ;
  113.  
  114.                     return 0 ;
  115.                     }
  116.                break ;
  117.  
  118.           case WM_COMMAND :
  119.  
  120.                if (lParam)
  121.                     {
  122.                     if (LOWORD (lParam) == 1 &&
  123.                          (HIWORD (wParam) == EN_ERRSPACE ||
  124.                           HIWORD (wParam) == EN_MAXTEXT))
  125.                               MessageBox (hwnd, "Edit control out of space.",
  126.                                           szAppName, MB_OK | MB_ICONSTOP) ;
  127.                     return 0 ;
  128.                     }
  129.  
  130.                else switch (LOWORD (wParam))
  131.                          {
  132.                          case IDM_NEW :
  133.                          case IDM_OPEN :
  134.                          case IDM_SAVE :
  135.                          case IDM_SAVEAS :
  136.                          case IDM_PRINT :
  137.                               MessageBeep (0) ;
  138.                               return 0 ;
  139.  
  140.                          case IDM_EXIT :
  141.                               SendMessage (hwnd, WM_CLOSE, 0, 0) ;
  142.                               return 0 ;
  143.  
  144.                          case IDM_UNDO :
  145.                               SendMessage (hwndEdit, WM_UNDO, 0, 0) ;
  146.                               return 0 ;
  147.  
  148.                          case IDM_CUT :
  149.                               SendMessage (hwndEdit, WM_CUT, 0, 0) ;
  150.                               return 0 ;
  151.  
  152.                          case IDM_COPY :
  153.                               SendMessage (hwndEdit, WM_COPY, 0, 0) ;
  154.                               return 0 ;
  155.  
  156.                          case IDM_PASTE :
  157.                               SendMessage (hwndEdit, WM_PASTE, 0, 0) ;
  158.                               return 0 ;
  159.  
  160.                          case IDM_DEL :
  161.                               SendMessage (hwndEdit, WM_CLEAR, 0, 0) ;
  162.                               return 0 ;
  163.  
  164.                          case IDM_SELALL :
  165.                               SendMessage (hwndEdit, EM_SETSEL, 0, -1) ;
  166.                               return 0 ;
  167.  
  168.                          case IDM_HELP :
  169.                               MessageBox (hwnd, "Help not yet implemented!",
  170.                                    szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  171.                               return 0 ;
  172.  
  173.                          case IDM_ABOUT :
  174.                               MessageBox (hwnd,
  175.                                    "POPPAD2 (c) Charles Petzold, 1996",
  176.                                    szAppName, MB_OK | MB_ICONINFORMATION) ;
  177.                               return 0 ;
  178.                          }
  179.                break ;
  180.  
  181.           case WM_CLOSE :
  182.                if (IDYES == AskConfirmation (hwnd))
  183.                     DestroyWindow (hwnd) ;
  184.                return 0 ;
  185.  
  186.           case WM_QUERYENDSESSION :
  187.                if (IDYES == AskConfirmation (hwnd))
  188.                     return 1 ;
  189.                else
  190.                     return 0 ;
  191.  
  192.           case WM_DESTROY :
  193.                PostQuitMessage (0) ;
  194.                return 0 ;
  195.           }
  196.      return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
  197.      }
  198.